"use strict";

const utils = require("./../utils");

module.exports = utils.isStandardBrowserEnv()
  ? // 标准浏览器环境完全支持测试所需的API——请求网址是否与当前位置具有相同的来源
    (function standardBrowserEnv() {
      const msie = /(msie|trident)/i.test(navigator.userAgent);
      const urlParsingNode = document.createElement("a");
      let originURL;

      /**
       * 解析URL并分析其组成结构
       *
       * @param {String} url 需要转换的URL
       * @returns {Object}
       */
      function resolveURL(url) {
        const href = url;

        if (msie) {
          // IE规范属性需要设置两次
          urlParsingNode.setAttribute("href", href);
          href = urlParsingNode.href;
        }

        urlParsingNode.setAttribute("href", href);

        // urlParsingNode提供了UrlUtils接口 - http://url.spec.whatwg.org/#urlutils
        return {
          href: urlParsingNode.href,
          protocol: urlParsingNode.protocol
            ? urlParsingNode.protocol.replace(/:$/, "")
            : "",
          host: urlParsingNode.host,
          search: urlParsingNode.search
            ? urlParsingNode.search.replace(/^\?/, "")
            : "",
          hash: urlParsingNode.hash
            ? urlParsingNode.hash.replace(/^#/, "")
            : "",
          hostname: urlParsingNode.hostname,
          port: urlParsingNode.port,
          pathname:
            urlParsingNode.pathname.charAt(0) === "/"
              ? urlParsingNode.pathname
              : "/" + urlParsingNode.pathname,
        };
      }

      originURL = resolveURL(window.location.href);

      /**
       * 确定网址是否与当前位置具有相同的来源
       *
       * @param {String} requestURL 需要测试的URL
       * @returns {boolean} true表示具有相同来源，否则为false
       */
      return function isURLSameOrigin(requestURL) {
        const parsed = utils.isString(requestURL)
          ? resolveURL(requestURL)
          : requestURL;
        return (
          parsed.protocol === originURL.protocol &&
          parsed.host === originURL.host
        );
      };
    })()
  : // 非标准浏览器环境 (web workers, react-native) 缺乏需要的支持。
    (function nonStandardBrowserEnv() {
      return function isURLSameOrigin() {
        return true;
      };
    })();
